]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
authPrompt: Await wiggle via show-message promise resolver
authorJoan Torres Lopez <joantolo@redhat.com>
Tue, 5 May 2026 15:28:18 +0000 (17:28 +0200)
committerMarge Bot <marge-bot@gnome.org>
Thu, 14 May 2026 18:26:04 +0000 (18:26 +0000)
Pass promise resolver through the show-message signal so the
message queue waits for the wiggle animation to finish before scheduling
the next message timeout. This replaces the previous approach of manually
increasing the timeout duration to account for the wiggle.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/4209>

js/gdm/authPrompt.js
js/gdm/util.js

index e186f8ca1312bb7a97697ad0301daefd7ebc5e69..c01c6fe2e6c045c9ba61ab5430ffc42918157ba3 100644 (file)
@@ -478,21 +478,18 @@ export const AuthPrompt = GObject.registerClass({
             this.reset();
     }
 
-    _onShowMessage(_userVerifier, serviceName, message, type) {
+    _onShowMessage(_userVerifier, serviceName, message, type, showMessageResolver) {
         this.setMessage(message, type);
         this.emit('prompted');
 
-        if (type === GdmUtil.MessageType.ERROR &&
-            this._userVerifier.serviceIsFingerprint(serviceName)) {
-            // TODO: Use Await for wiggle to be over before unfreezing the user verifier queue
-            const wiggleParameters = {
-                duration: 65,
-                wiggleCount: 3,
-            };
-            this._userVerifier.increaseCurrentMessageTimeout(
-                wiggleParameters.duration * (wiggleParameters.wiggleCount + 2));
-            wiggle(this._message, wiggleParameters);
-        }
+        const shouldWiggle = type === GdmUtil.MessageType.ERROR &&
+            this._userVerifier.serviceIsFingerprint(serviceName);
+
+        const wigglePromise = shouldWiggle
+            ? wiggle(this._message, {duration: 65, wiggleCount: 3})
+            : Promise.resolve();
+
+        showMessageResolver?.(wigglePromise);
     }
 
     _onVerificationFailed(userVerifier, serviceName, canRetry) {
index d7339c14056b04017096137c27c7b18fb0f8593e..eebbc8e240f9ce894991a1e662b819b167817ea2 100644 (file)
@@ -262,11 +262,6 @@ export class ShellUserVerifier extends Signals.EventEmitter {
         this.emit('no-more-messages');
     }
 
-    increaseCurrentMessageTimeout(interval) {
-        if (!this._messageQueueTimeoutId && interval > 0)
-            this._currentMessageExtraInterval = interval;
-    }
-
     _serviceHasPendingMessages(serviceName) {
         return this._messageQueue.some(m => m.serviceName === serviceName);
     }
@@ -279,17 +274,23 @@ export class ShellUserVerifier extends Signals.EventEmitter {
             this._queuePriorityMessage(serviceName, null, messageType);
     }
 
-    _queueMessageTimeout() {
-        if (this._messageQueueTimeoutId !== 0)
+    async _queueMessageTimeout() {
+        if (this._messageQueueTimeoutId !== 0 || this._showMessageResolver)
             return;
 
         const message = this.currentMessage;
+        const {promise, resolve} = Promise.withResolvers();
+        this._showMessageResolver = resolve;
 
-        delete this._currentMessageExtraInterval;
-        this.emit('show-message', message.serviceName, message.text, message.type);
+        this.emit('show-message', message.serviceName, message.text, message.type, this._showMessageResolver);
+
+        await promise.catch(logError);
+        if (!this._showMessageResolver)
+            return;
+        this._showMessageResolver = null;
 
         this._messageQueueTimeoutId = GLib.timeout_add_once(GLib.PRIORITY_DEFAULT,
-            message.interval + (this._currentMessageExtraInterval | 0), () => {
+            message.interval, () => {
                 this._messageQueueTimeoutId = 0;
 
                 if (this._messageQueue.length > 1) {
@@ -330,6 +331,12 @@ export class ShellUserVerifier extends Signals.EventEmitter {
             GLib.source_remove(this._messageQueueTimeoutId);
             this._messageQueueTimeoutId = 0;
         }
+
+        if (this._showMessageResolver) {
+            this._showMessageResolver();
+            this._showMessageResolver = null;
+        }
+
         this.emit('show-message', null, null, MessageType.NONE);
     }